\chapter{Abstraction de la session}

\label{axsession}

Cette classe a pour but de séparer totalement la gestion de la session utilisateur de l'application.

Pour rappel, une session PHP est un ensemble de données stockées en base pendant quelque temps et dépendant de la personne qui visite le site. C'est une façon de créer une certaine persistance lors de la navigation, que le protocole de base HTTP ne permet pas du tout. Une fois une requête terminée, le serveur oublie totalement le client, seul le client peut lui redonner un identifiant pour que le serveur retrouve ses données.

Cette classe est donc capable d'effectuer certaines opérations de base sur la session. Avoir tout rassemblé ici permet principalement d'observer ce qu'il se passe entre le moment d'appel de la classe et le moment du stockage en session\footnote{Notamment en cas de collision des données, comme par exemple si on sauvegarde en session deux données sur le même nom d'attribut.}.

Puisque dans notre application, une bonne partie des données est stockée en session, connaître son état permet aussi de savoir comment sont traités les données dans le formulaire.

L'utilisation de méthodes statiques\footnote{Indépendantes de l'instance.} permet par ailleurs d'utiliser la classe n'importe où dans le code.

Les attributs \textit{flashs} sont une particularité de Symfony qui permet de définir des attributs valides seulement pendant la requête courante et la suivante. Ils sont utiles pour les redirections.

\begin{lstlisting}[frame=L,breaklines=true, caption={Code de la classe \textit{SessionUtils}}]
<?php
/**
 * Abstraction class for session storage
 * 
 * Stored in session
 * - formData[]
 * - bindedValues[]
 * - last_idDevis[]
 * - offreInitiale
 * - baseurl
 * - error
 * - souscriptionUser/souscriptionId
 * - idUser
 * 
 *
 * @package    eovi
 * @author     Valentin Clavreul <valentin.clavreul@smile.fr>
 * @version    SVN: $Id: SessionUtils.php 489 2011-09-08 10:07:50Z hufon $
 */
class SessionUtils
{

    /**
     * Retuns data stored in $attribute, or $defaut by default
     * 
     * @param string $attribute
     * @param mixed $defaut
     * @return mixed Stored data
     */
    public static function getData($attribute = 'formData', $defaut = array())
    {
        $data = sfContext::getInstance()->getUser()->getAttribute($attribute, $defaut);
        return $data;
    }

    /**
     * Save a $data in $attribute, erases any previous values
     *
     * @param mixed $data
     * @param string $attribute 
     */
    public static function saveData($data= array(), $attribute = 'formData')
    {
        sfContext::getInstance()->getUser()->setAttribute($attribute, $data);
    }

    /**
     * Save a $data in $attribute, or merge it, if there was a previous data (arrays only)
     *
     * @param mixed $data
     * @param string $attribute
     * @return mixed the new data, or the old one if the marge could not be executed
     */
    public static function mergeAndSaveData($data= array(),
            $attribute = 'formData')
    {
        $originalData = self::getData($attribute);
        if ( is_array($data) ) {
            $newData = ArrayUtils::arrayMerge($originalData, $data);
            self::saveData($newData, $attribute);
            return $newData;
        }
        else {
            return $originalData;
        }
    }

    /**
     * Erase a $key of an array stored in $attribute
     * Optionnaly, an intermediate key ($wrapper) can be defined
     *
     * @param mixed $key
     * @param mixed $wrapper
     * @param type $attribute
     * @return string the actual data in $attribute
     */
    public static function unsetData($key, $wrapper = null,
            $attribute= 'formData')
    {
        $originalData = self::getData($attribute);
        if ( $wrapper !== null ) {
            unset($originalData[$wrapper][$key]);
        }
        else {
            unset($originalData[$key]);
        }
        self::saveData($originalData, $attribute);
        return $originalData;
    }

    /**
     * Set a flash atribute
     * 
     * @param mixed $data
     * @param string $attribute 
     */
    public static function setFlash($data, $attribute)
    {
        sfContext::getInstance()->getUser()->setFlash($attribute, $data);
    }

    /**
     * Get a flash atribute
     *
     * @param string $attribute
     * @param mixed $defaut default value
     * @return mixed 
     */
    public static function getFlash($attribute, $defaut = null)
    {
        return sfContext::getInstance()->getUser()->getFlash($attribute, $defaut);
    }
    
    /**
     * Return true, if the session is new
     *
     * @return bool 
     */
    public static function isNew()
    {
        if(self::getData('newSession', true))
        {
            self::saveData(false, 'newSession');
            return true;
        }
        return false;
    }

}
\end{lstlisting}